// 枚举（Enum）类型用于取值被限定在一定范围内的场景，比如一周只能有七天，颜色限定为红绿蓝等。

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true

console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true



// 我们也可以给枚举项手动赋值：
// 如果未手动赋值的枚举项与手动赋值的重复了，TypeScript 是不会察觉到这一点的：
enum Day {Sun = 3, Mon = 1, Tue, Wed, Thu, Fri, Sat};

console.log(Day["Sun"] === 3); // true
console.log(Day["Wed"] === 3); // true
console.log(Day[3] === "Sun"); // false
console.log(Day[3] === "Wed"); // true


// 如果紧接在计算所得项后面的是未手动赋值的项，那么它就会因为无法获得初始值而报错
// enum Color {Red = "red".length, Green, Blue}; //error
// 常数枚举
// 常数枚举是使用 const enum 定义的枚举类型
// const enum Directions {
//     Up,
//     Down,
//     Left,
//     Right
// }
// let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
// console.log(directions);
//常数枚举与普通枚举的区别是，它会在编译阶段被删除，并且不能包含计算成员
// const enum Color {Red, Green, Blue = "blue".length}; //error

// 外部枚举*
// 之前提到过，declare 定义的类型只会用于编译时的检查，编译结果中会被删除。*
declare enum Directions {
    Up,
    Down,
    Left,
    Right
}
// let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; // Directions is not defined
// console.log(directions);
// 同时使用 declare 和 const 也是可以的：
// declare const enum Directions {
//     Up,
//     Down,
//     Left,
//     Right
// }

// let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
// console.log(directions);
// 编译结果：
// var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

enum STATUS {
    UP = 0,
    DOWN = 1,
    LEFT = 2,
    RIGHT = 3
}

type LIST = keyof typeof STATUS
interface Home {
    type: Array<LIST>
}
let h: Home = {type: ['DOWN', 'LEFT', 'RIGHT', 'UP']}
console.log(h);


function getEnum(params: LIST): STATUS {
    return STATUS[params]
}

console.log(getEnum('DOWN'));


